package com.wsoft.bpm.service;

import com.wsoft.bpm.bean.ApprovalChainNode;
import com.wsoft.bpm.enums.ExecuteType;
import com.wsoft.bpm.query.mapping.ExtraBusinessDataQuery;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 工作流接口
 *
 * @Author zhonglj
 * @Date 2025/1/9 13:29
 */
public interface WorkFlowService {
    /**
     * 开启工作流
     *
     * @param processDefinitionKey 流程定义唯一键
     * @param entityClass          数据库表对应的实体类
     * @param businessKey          业务数据唯一键
     * @param extraData            额外的前端参数
     * @param map                  自定义工作流流程参数
     * @return string
     * @author zhonglj
     * @date 2024-09-19 16:04
     **/
    String startProcess(String processDefinitionKey, Class<?> entityClass, String businessKey, ExtraBusinessDataQuery extraData, Map map);

    /**
     * 开启工作流
     *
     * @param processDefinitionKey 流程定义唯一键
     * @param tableName            对应数据表名
     * @param businessKey          业务数据唯一键
     * @param extraData            额外的前端参数
     * @param map                  自定义工作流流程参数
     * @return string
     * @author zhonglj
     * @date 2024-09-19 16:04
     **/
    String startProcess(String processDefinitionKey, String tableName, String businessKey, ExtraBusinessDataQuery extraData, Map map);

    /**
     * 开启工作流
     *
     * @param processDefinitionKey 流程定义唯一键
     * @param tableName            对应数据表名
     * @param businessKeyColumn    业务数据唯一键字段名
     * @param businessKey          业务数据唯一键
     * @param statusColumn         业务数据工作流状态字段名
     * @param extraData            额外的前端参数
     * @param map                  自定义工作流流程参数
     * @return string
     * @author zhonglj
     * @date 2024-09-19 16:04
     **/
    String startProcess(String processDefinitionKey, String tableName, String businessKeyColumn, String businessKey, String statusColumn, ExtraBusinessDataQuery extraData, Map map);

    /**
     * 同意
     *
     * @param taskId
     * @param comment
     * @return void
     * @author zhonglj
     * @date 2025/2/26 9:38
     **/
    void agree(String taskId, String comment);

    /**
     * 拒绝
     *
     * @param taskId
     * @param comment
     * @return void
     * @author zhonglj
     * @date 2025/2/26 9:38
     **/
    void refuse(String taskId, String comment);

    /**
     * 获取流程变量
     *
     * @param businessKey  业务编码
     * @param variableName 变量名
     * @return java.lang.Object
     * @author zhonglj
     * @date 2025/1/9 9:56
     **/
    Object getVariable(String businessKey, String variableName);

    /**
     * 设置流程变量
     *
     * @param businessKey  业务编码
     * @param variableName 变量名
     * @param value        变量值
     * @return void
     * @author zhonglj
     * @date 2025/1/9 9:56
     **/
    void setVariable(String businessKey, String variableName, Object value);

    /**
     * 设置流程变量
     *
     * @param businessKey 业务编码
     * @param variables   流程变量map
     * @return void
     * @author zhonglj
     * @date 2025/1/9 9:56
     **/
    void setVariable(String businessKey, Map<String, Object> variables);

    /**
     * 候选组织、角色、岗位、职务级别内容格式化
     *
     * @param groups
     * @param type
     * @return java.util.List<java.lang.String>
     * @author zhonglj
     * @date 2025/1/14 14:56
     **/
    List<String> convertToCandidateFormat(List<String> groups, ExecuteType type);

    /**
     * 重新设置动态审批链
     *
     * @param businessKey 业务编码
     * @param variableKey 动态审批链变量名
     * @param newNodes    新的动态节点列表
     * @return boolean
     * @author zhonglj
     * @date 2025/2/18 11:15
     **/
    boolean resetDynamicApprovalChain(String businessKey, String variableKey, ArrayList<ApprovalChainNode> newNodes);
}
